å ç¢ã§ã¹ã±ãŒã©ãã«ããã€ä¿å®æ§ã®é«ãã°ããŒãã«åæ£ã·ã¹ãã ãæ§ç¯ããäžã§ãåå®å šãªã¡ãã»ãŒãžãããŒã«ãŒãšã€ãã³ãã¹ããªãŒãã³ã°åå®è£ ãæããéèŠãªåœ¹å²ãæ¢ããŸãã
åå®å šãªã¡ãã»ãŒãžãããŒã«ãŒïŒã°ããŒãã«ã·ã¹ãã ã®ããã®ã€ãã³ãã¹ããªãŒãã³ã°åå®è£ ãç¿åŸãã
çŸä»£ã®è€éãªåæ£ã·ã¹ãã ã®ç¶æ³ã«ãããŠããµãŒãã¹éã§æ å ±ã確å®ã«äº€æããèœåã¯æãéèŠã§ããã¡ãã»ãŒãžãããŒã«ãŒãšã€ãã³ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã¯ããã®éä¿¡ã®ããã¯ããŒã³ãšããŠæ©èœããéåæã€ã³ã¿ã©ã¯ã·ã§ã³ãå¯èœã«ãããµãŒãã¹ã®ççµååãä¿é²ããã¹ã±ãŒã©ããªãã£ã容æã«ããŸããããããã·ã¹ãã ã®è€éããšå°ççãªåæ£ãé²ãã«ã€ããŠãé倧ãªèª²é¡ãæµ®äžããŸããããã¯ã亀æãããã€ãã³ãã®åå®å šæ§ã確ä¿ããããšã§ããããã§ãå ç¢ãªã€ãã³ãã¹ããªãŒãã³ã°åå®è£ ã¯ãåãªããã¹ããã©ã¯ãã£ã¹ã«ãšã©ãŸãããå埩åããããä¿å®å¯èœã§ãã°ããŒãã«ã«æŽåæ§ã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ãªãã®ãšãªããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãåå®å šãªã¡ãã»ãŒãžãããŒã«ãŒã®äžçãæ·±ãæãäžãããªããããéèŠãªã®ããééããäžè¬çãªèª²é¡ããããŠäžçäžã®éçºè ãå©çšã§ããäž»èŠãªå®è£ æŠç¥ãšãã¯ãããžãŒã«ã€ããŠæ¢ããŸããã€ãã³ãã¹ããªãŒã å ã§ããŒã¿åãå®çŸ©ã管çãé©çšããéã®åŸ®åŠãªéããçè§£ããããä¿¡é Œæ§ãé«ãäºæž¬å¯èœãªåæ£ã·ã¹ãã ãæ§ç¯ããåãé€ããŸãã
ã€ãã³ãã¹ããªãŒãã³ã°ã«ãããåå®å šæ§ã®å¿ èŠæ§
補åã«ã¿ãã°ç®¡çããæ³šæåŠçã顧客ãµããŒããŸã§ããã¹ãŠãç°ãªããã€ã¯ããµãŒãã¹ãåŠçããã°ããŒãã«ãªEã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ããããããã®ãµãŒãã¹ã¯ãã€ãã³ããå
¬éããã³è³Œèªããããšã§éä¿¡ããŸããåå®å
šæ§ããªãå ŽåããããµãŒãã¹ãpriceãã£ãŒã«ããæååïŒäŸïŒã$19.99ãïŒãšããŠæã€ã€ãã³ããå
¬éããå¥ã®ãµãŒãã¹ããããæ°å€åïŒäŸïŒ19.99ïŒãšããŠæåŸ
ãããããããŸããããã®äžèŠäºçްãªäžäžèŽããç¹ã«ç°ãªãã¿ã€ã ãŸãŒã³ãèŠå¶ç°å¢ã§éçšããå Žåã壿»
çãªé害ãããŒã¿ç Žæãããã³å€§å¹
ãªããŠã³ã¿ã€ã ã«ã€ãªããå¯èœæ§ããããŸãã
ã€ãã³ãã¹ããªãŒãã³ã°ã«ãããåå®å šæ§ãšã¯ã亀æãããã¡ãã»ãŒãžã®æ§é ãšããŒã¿åããäºåã«å®çŸ©ãããå¥çŽã«æºæ ããããšãä¿èšŒããããšã§ãããã®å¥çŽã¯ããã°ãã°ã¹ããŒããšåŒã°ããããŒã¿ã®éåçãšããŠæ©èœããŸãããããã¥ãŒãµãŒãã€ãã³ããå ¬éããå Žåãããã¯ã¹ããŒãã«æºæ ããªããã°ãªããŸãããã³ã³ã·ã¥ãŒããŒã賌èªããå Žåããã®ã¹ããŒãã«æºæ ããããŒã¿ãæåŸ ããŸããããã«ããã以äžãä¿èšŒãããŸãã
- ããŒã¿æŽåæ§ïŒäžæ£ãªåœ¢åŒãŸãã¯äžæ£ç¢ºãªããŒã¿ãã·ã¹ãã å šäœã«äŒæããã®ãé²ããããŒã¿ç Žæãããžãã¹ããžãã¯ãšã©ãŒã®ãªã¹ã¯ã軜æžããŸãã
 - äºæž¬å¯èœãªåäœïŒã³ã³ã·ã¥ãŒããŒã¯åä¿¡ã€ãã³ãã®æ§é ãšåã«äŸåã§ãããããå®è£ ãç°¡çŽ åãããåºç¯ãªå®è¡ææ€èšŒã®å¿ èŠæ§ãæžå°ããŸãã
 - ãããã°ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ç°¡çŽ åïŒåé¡ãçºçããå Žåãéçºè ã¯åé¡ããããã¥ãŒãµãŒã®ã¹ããŒãéµå®ã«ããã®ããã³ã³ã·ã¥ãŒããŒã®è§£éã«ããã®ããè¿ éã«ç¹å®ã§ããŸãã
 - é²åã®ç°¡çŽ åïŒæç¢ºã«å®çŸ©ãããã¹ããŒããšå ç¢ãªåã·ã¹ãã ã«ãããã€ãã³ãæ§é ãæéãšãšãã«é²åãããããšïŒäŸïŒæ°ãããã£ãŒã«ãã®è¿œå ãããŒã¿åã®å€æŽïŒã¯ç®¡çå¯èœãªããã»ã¹ãšãªããã³ã³ã·ã¥ãŒããŒãžã®ç Žå£ç倿Žãæå°éã«æããŸãã
 - çžäºéçšæ§ïŒå€æ§ãªéçºããŒã ãšãã¯ãããžãŒã¹ã¿ãã¯ãååšããã°ããŒãã«åãããäžçã«ãããŠãåå®å šæ§ã¯ãç°ãªãèšèªããã¬ãŒã ã¯ãŒã¯ã§æ§ç¯ããããµãŒãã¹ã广çã«éä¿¡ã§ããããšãä¿èšŒããŸãã
 
ã€ãã³ãã¹ããªãŒãã³ã°åå®è£ ã«ãããäžè¬çãªèª²é¡
æç¢ºãªå©ç¹ãããã«ãããããããã€ãã³ãã¹ããªãŒãã³ã°ã§çã®åå®å šæ§ãå®çŸããããšã¯å®¹æã§ã¯ãããŸãããç¹ã«å€§èŠæš¡ã§åæ£åããã€é²åããã·ã¹ãã ã§ã¯ãããã€ãã®èª²é¡ãäžè¬çã«çºçããŸãã
1. åçãŸãã¯ç·©ãããªåä»ãã®ããŒã¿åœ¢åŒ
JSONã®ãããªåœ¢åŒã¯ããŠããã¿ã¹ã§äººéãèªãããã®ã®ãæ¬è³ªçã«æè»ã§ãããã®æè»æ§ã¯è«žåã®å£ãšãªãåŸãŸããæç€ºçãªã¹ããŒã匷å¶ããªããã°ãäºæããªãåãäžè¶³ããŠãããã£ãŒã«ããæã€ããŒã¿ãç°¡åã«éä¿¡ããŠããŸããŸããäŸãã°ãæŽæ°ã§ããã¹ãquantityãã£ãŒã«ããæååãŸãã¯æµ®åå°æ°ç¹æ°ãšããŠéä¿¡ãããè§£æãšã©ãŒãäžæ£ç¢ºãªèšç®ã«ã€ãªããå¯èœæ§ããããŸãã
2. ã¹ããŒãé²å管ç
ã¢ããªã±ãŒã·ã§ã³ã¯ãã£ãã«éçã§ã¯ãããŸãããããžãã¹èŠä»¶ã®å€åã«äŒŽããã€ãã³ãã¹ããŒããé²åããªããã°ãªããŸããã課é¡ã¯ãæ¢åã®ã³ã³ã·ã¥ãŒããŒãå£ããã«ãããã®ã¹ããŒããæŽæ°ããããšã«ãããŸãããããã¥ãŒãµãŒã¯æ°ãããªãã·ã§ã³ãã£ãŒã«ãã远å ããããã³ã³ã·ã¥ãŒããŒã¯ä»¥åãªãã·ã§ã³ã ã£ããã£ãŒã«ããå¿ é ã«ããããããããããŸããããããã®å€æŽãé©åã«ç®¡çããã«ã¯ãç¶¿å¯ãªèšç»ãšãåŸæ¹äºææ§ããã³åæ¹äºææ§ããµããŒãããããŒã«ãå¿ èŠã§ãã
3. èšèªãšãã©ãããã©ãŒã ã®ç°ç𮿷·åæ§
ã°ããŒãã«äŒæ¥ã¯ã倿§ãªãã¯ãããžãŒã¹ã¿ãã¯ãæ¡çšããããšããããããŸãããµãŒãã¹ã¯JavaãPythonãGoãNode.jsããŸãã¯.NETã§èšè¿°ãããŠãããããããŸããããããã®ç°ãªãèšèªããã©ãããã©ãŒã éã§åå®çŸ©ãäžè²«ããŠçè§£ãããé©çšãããããšãä¿èšŒããããšã¯ã倧ããªåãçµã¿ã§ããå ±éã®èšèªã«äŸåããªãã¹ããŒãå®çŸ©åœ¢åŒãäžå¯æ¬ ã§ãã
4. ã¹ã±ãŒã©ããªãã£ãšããã©ãŒãã³ã¹ã®ãªãŒããŒããã
åãã§ãã¯ãšã¹ããŒãæ€èšŒãå®è£ ãããšãããã©ãŒãã³ã¹ã®ãªãŒããŒããããçããå¯èœæ§ããããŸããéžæãããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒãšæ€èšŒã¡ã«ããºã ã¯ãããã«ããã¯ã«ãªãããšãªããé«ã¹ã«ãŒãããã®ã€ãã³ãã¹ããªãŒã ãåŠçããã®ã«ååå¹ççã§ãªããã°ãªããŸãããããã¯ããªã¢ã«ã¿ã€ã ãŸãã¯ãã¢ãªã¢ã«ã¿ã€ã ã®ããŒã¿åŠçã«ãšã£ãŠç¹ã«éèŠã§ãã
5. 忣åããŒã¿æææš©ãšã¬ããã³ã¹
ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§ã¯ãå€ãã®å Žåãç°ãªãããŒã ãç°ãªããµãŒãã¹ãã²ããŠã¯ããããçæããã€ãã³ããææããŸãããããã®åæ£ããããŒã éã§ã¹ããŒãã®å®çŸ©ã管çãã¬ããã³ã¹ã«å¯ŸããŠçµ±äžãããã¢ãããŒãã確ç«ããããšã¯å°é£ãªå ŽåããããŸããæç¢ºãªæææš©ãšããã»ã¹ããªããã°ãã¹ããŒãã®ãããäžæŽåãçºçããå¯èœæ§ãé«ããªããŸãã
6. æšæºåããã匷å¶ã¡ã«ããºã ã®æ¬ åŠ
å€ãã®ã¡ãã»ãŒãžãããŒã«ãŒã¯åºæ¬çãªæ€èšŒãæäŸããŸãããè€éãªã¹ããŒãã«ãŒã«ã匷å¶ããããã¹ããŒãããŒãžã§ã³ã广çã«ç®¡çãããããããã®å ç¢ãªçµã¿èŸŒã¿ã¡ã«ããºã ãæ¬ ããŠããããšããããããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãããã®ãã§ãã¯ãèªåèªèº«ã§å®è£ ããå¿ èŠãããããã倧ããªè² æ ãããããŸãã
åå®å šãªã€ãã³ãã¹ããªãŒãã³ã°ã®ããã®æŠç¥ãšãã¯ãããžãŒ
ãããã®èª²é¡ãå æããããã«ã¯ãæç¢ºã«å®çŸ©ãããæŠç¥ãšé©åãªãã¯ãããžãŒã®çµã¿åãããäžå¯æ¬ ã§ããåå®å šãªã€ãã³ãã¹ããªãŒãã³ã°ã®æ žå¿ã¯ãã€ãã³ãã©ã€ããµã€ã¯ã«ã®ããŸããŸãªæ®µéã§ããŒã¿ã³ã³ãã©ã¯ãïŒã¹ããŒãïŒãå®çŸ©ãã匷å¶ããããšã«ãããŸãã
1. ã¹ããŒãå®çŸ©èšèª
åå®å šæ§ã®åºç€ãšãªãã®ã¯ã衚çŸåè±ãã§ãã©ãããã©ãŒã ã«äŸåããªãå ç¢ãªã¹ããŒãå®çŸ©èšèªã§ããããã€ãã®äžè¬çãªéžæè¢ããããããããã«åŒ·ã¿ããããŸãã
- Apache AvroïŒããŒã¿åãšãããã³ã«ã®å®çŸ©ã«JSONã䜿çšããè¡ããŒã¹ã®ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã·ã¹ãã ã§ããã³ã³ãã¯ããªããŒã¿è¡šçŸãšå¹ççãªãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã®ããã«èšèšãããŠããŸããAvroã¹ããŒãã¯éçã«å®çŸ©ãããã¹ããŒãé²åã®ãµããŒãã«ãããé²åããããŒã¿æ§é ã«éåžžã«é©ããŠããŸããApache Kafkaãšåºã䜿çšãããŠããŸãã
    
Avroã¹ããŒãã®äŸ (product_created.avsc)ïŒ
{ "type": "record", "name": "ProductCreated", "namespace": "com.example.events", "fields": [ {"name": "product_id", "type": "string"}, {"name": "name", "type": "string"}, {"name": "price", "type": "double"}, {"name": "stock_count", "type": "int", "default": 0}, {"name": "timestamp", "type": "long", "logicalType": "timestamp-millis"} ] } - Protocol Buffers (Protobuf)ïŒGoogleã«ãã£ãŠéçºãããProtobufã¯ãæ§é åããŒã¿ãã·ãªã¢ã©ã€ãºããããã®èšèªã«äŸåããããã©ãããã©ãŒã ã«äŸåãããæ¡åŒµå¯èœãªã¡ã«ããºã ã§ããéåžžã«å¹ççã§ãã³ã³ãã¯ããã€é«éã§ããã¹ããŒãã¯
.protoãã¡ã€ã«ã§å®çŸ©ãããŸããProtobufã®åŒ·ã¿ã¯ããã®ããã©ãŒãã³ã¹ãšåŒ·åãªã³ã³ãã©ã¯ã匷å¶ã«ãããŸããProtobufã¹ããŒãã®äŸ (product_event.proto)ïŒ
syntax = "proto3"; package com.example.events; message ProductCreated { string product_id = 1; string name = 2; double price = 3; optional int32 stock_count = 4 [default = 0]; int64 timestamp = 5; } - JSON SchemaïŒJSONããã¥ã¡ã³ããæ³šéä»ãããæ€èšŒããããšãå¯èœã«ããããã£ãã©ãªãŒã§ããJSONããŒã¿ã®æ§é ãå
容ãã»ãã³ãã£ã¯ã¹ãå®çŸ©ããã®ã«åªããŠããŸããçã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«é¢ããŠã¯AvroãProtobufã»ã©ããã©ãŒãã³ã¹æé©åãããŠããŸããããJSONã®äººæ°ã«ããéåžžã«æè»ã§åºãçè§£ãããŠããŸãã
    
JSONã¹ããŒãã®äŸ (product_created.schema.json)ïŒ
{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "ProductCreated", "description": "Event indicating a new product has been created.", "type": "object", "properties": { "product_id": {"type": "string", "description": "Unique identifier for the product."} , "name": {"type": "string", "description": "Name of the product."} , "price": {"type": "number", "format": "double", "description": "Current price of the product."} , "stock_count": {"type": "integer", "default": 0, "description": "Number of items in stock."} , "timestamp": {"type": "integer", "format": "int64", "description": "Timestamp in milliseconds since epoch."} }, "required": ["product_id", "name", "price", "timestamp"] } 
2. ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒ
ã¹ããŒããå®çŸ©ããããããã®ã¹ããŒãã«åŸã£ãŠããŒã¿ãã·ãªã¢ã©ã€ãºããæ¹æ³ãå¿ èŠã§ããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒã®éžæã¯ãããã©ãŒãã³ã¹ããµã€ãºãäºææ§ã«çŽæ¥åœ±é¿ããŸãã
- ãã€ããªåœ¢åŒ (Avro, Protobuf)ïŒãããã®åœ¢åŒã¯ã³ã³ãã¯ããªãã€ããªããŒã¿ãçæããã¡ãã»ãŒãžãµã€ãºãå°ããããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³/ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãé«éåããŸããããã¯ãé«ã¹ã«ãŒãããã®ã·ããªãªããç¹ã«ã°ããŒãã«ãªããŒã¿ãããŒã«ãããŠãããã¯ãŒã¯åž¯åå¹
ãæå°éã«æããäžã§éèŠã§ãã
    
å©ç¹ïŒé«æ§èœãå°ããªãããããªã³ãã 課é¡ïŒç¹å®ã®ããŒã«ããªããã°äººéãèªããŸããã
 - ããã¹ãåœ¢åŒ (JSON)ïŒãã€ããªåœ¢åŒãšæ¯èŒããŠãµã€ãºãšé床ã®ç¹ã§å¹çã¯å£ããŸãããJSONã¯äººéãèªããç°ãªããã©ãããã©ãŒã ãèšèªã§åºããµããŒããããŠããŸããJSON Schemaãšçµã¿åãããŠäœ¿çšââãããšã匷åãªåä¿èšŒãæäŸã§ããŸãã
    
å©ç¹ïŒäººéãèªããããŠããã¿ã¹ãªãµããŒãã 課é¡ïŒã¡ãã»ãŒãžãµã€ãºã倧ãããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³/ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãé ããªãå¯èœæ§ããããŸãã
 
3. ã¹ããŒãã¬ãžã¹ããª
ã¹ããŒãã¬ãžã¹ããªã¯ãã¹ããŒããä¿åã管çãããŒãžã§ã³ç®¡çããããã®äžå€®ãªããžããªã§ããçµç¹å ã§äœ¿çšããããã¹ãŠã®ã¹ããŒãã®åäžã®æ å ±æºãšããŠæ©èœããŸããã¹ããŒãã¬ãžã¹ããªã®äž»ãªæ©èœã«ã¯ã以äžãå«ãŸããŸãã
- ã¹ããŒãä¿åïŒå®çŸ©ããããã¹ãŠã®ã¹ããŒããæ°žç¶åããŸãã
 - ã¹ããŒãããŒãžã§ã³ç®¡çïŒã¹ããŒãã®ç°ãªãããŒãžã§ã³ã管çããé©åãªé²åãå¯èœã«ããŸãã
 - ã¹ããŒãäºææ§ãã§ãã¯ïŒäºææ§ã«ãŒã«ïŒåŸæ¹ãåæ¹ãå®å šïŒã匷å¶ããã¹ããŒãã®æŽæ°ãæ¢åã®ã³ã³ã·ã¥ãŒããŒããããã¥ãŒãµãŒãç Žå£ããªãããã«ããŸãã
 - ã¹ããŒãçºèŠïŒãããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒããç¹å®ã®ãããã¯ãŸãã¯ã€ãã³ãã®æ£ããã¹ããŒãããŒãžã§ã³ãçºèŠã§ããããã«ããŸãã
 
äžè¬çãªã¹ããŒãã¬ãžã¹ããªãœãªã¥ãŒã·ã§ã³ã«ã¯ã以äžãå«ãŸããŸãã
- Confluent Schema RegistryïŒApache Kafkaãšå¯æ¥ã«çµ±åãããAvroãJSON SchemaãProtobufããµããŒãããŸããKafkaãšã³ã·ã¹ãã ã«ãããããã¡ã¯ãã¹ã¿ã³ããŒãã§ãã
 - Apicurio RegistryïŒAvroãProtobufãJSON SchemaãOpenAPIãªã©è€æ°ã®åœ¢åŒããµããŒããããªãŒãã³ãœãŒã¹ã®ã¬ãžã¹ããªã§ãã
 
4. ã¡ãã»ãŒãžãããŒã«ãŒãšã€ãã³ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã®æ©èœ
ã¡ãã»ãŒãžãããŒã«ãŒãŸãã¯ã€ãã³ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ã®éžæã圹å²ãæãããŸããå€ãã®ãã©ãããã©ãŒã ã¯ããèªäœã§ã¹ããŒãã匷å¶ããŸããããã¹ããŒãã¬ãžã¹ããªã®ãããªå€éšããŒã«ãšçµ±åããããåºæ¬çãªæ€èšŒããã¯ãæäŸãããã§ããŸãã
- Apache KafkaïŒåæ£åã€ãã³ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ãKafkaèªäœã¯ã¹ããŒãã匷å¶ããŸããããåå®å šæ§ã®ããã«ã¹ããŒãã¬ãžã¹ããªãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãããã®ã¹ã±ãŒã©ããªãã£ãšèé害æ§ã«ãããã°ããŒãã«ããŒã¿ãã€ãã©ã€ã³ã«æé©ã§ãã
 - RabbitMQïŒããŸããŸãªãããã³ã«ããµããŒããã人æ°ã®ã¡ãã»ãŒãžãããŒã«ãŒããã€ãã£ãã§ã¹ããŒã察å¿ã§ã¯ãããŸããããæ€èšŒã¬ã€ã€ãŒãšçµ±åã§ããŸãã
 - Amazon KinesisïŒãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒãã³ã°ã®ããã®ãããŒãžãAWSãµãŒãã¹ãKafkaãšåæ§ã«ãå€éšã®ã¹ããŒã管çããŒã«ãšã®çµ±åããã°ãã°å¿ èŠã«ãªããŸãã
 - Google Cloud Pub/SubïŒãã«ãããŒãžãã®ãªã¢ã«ã¿ã€ã ã¡ãã»ãŒãžã³ã°ãµãŒãã¹ãã¡ãã»ãŒãžã®é åºä»ããšéè€æé€ãæäŸããŸãããã¹ããŒã匷å¶ã®ããã«ã¯ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ããžãã¯ãŸãã¯å€éšããŒã«ã«äŸåããŸãã
 
5. ã¯ã©ã€ã¢ã³ããµã€ãã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯
ã»ãšãã©ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒïŒAvroãProtobufïŒã«ã¯ã³ãŒãçæããŒã«ãä»å±ããŠããŸããéçºè
ã¯ã.avscãŸãã¯.protoãã¡ã€ã«ããèšèªåºæã®ã¯ã©ã¹ãçæã§ããŸãããããã®çæãããã¯ã©ã¹ã¯ã³ã³ãã€ã«æã®åãã§ãã¯ãæäŸãããããã¥ãŒãµãŒãæ£ããæ§é ã®ã€ãã³ããäœæããŠããããšãããã³ã³ã³ã·ã¥ãŒããŒãæç¢ºã«å®çŸ©ããã圢åŒã®ããŒã¿ãæåŸ
ããŠããããšãä¿èšŒããŸãã
äŸïŒæŠå¿µç - Avroã䜿çšããJavaïŒïŒ
            // Generated Avro class
ProductCreated event = new ProductCreated();
event.setProductId("prod-123");
event.setName("Global Widget");
event.setPrice(25.50);
// event.setStockCount(100); // This field has a default value
// Sending the event to Kafka
kafkaProducer.send(new ProducerRecord<>(topic, event.getProductId(), event));
            
          
        JSON Schemaã䜿çšããå Žåãã»ãšãã©ã®èšèªã«ã¯ãéä¿¡åãŸãã¯åä¿¡åŸã«JSONãã€ããŒããäžããããã¹ããŒãã«å¯ŸããŠæ€èšŒããããã®ã©ã€ãã©ãªãååšããŸãã
å®è·µã«ãããåå®å šãªã€ãã³ãã¹ããªãŒãã³ã°ã®å®è£
åå®å šãªã€ãã³ãã¹ããªãŒãã³ã°ã®å®è£ ã«ã¯ãéçºãéçšãã¬ããã³ã¹ã«åã¶äœç³»çãªã¢ãããŒããå¿ èŠã§ãã
ã¹ããã1ïŒã€ãã³ãã³ã³ãã©ã¯ãïŒã¹ããŒãïŒãå®çŸ©ãã
ã³ãŒããèšè¿°ããåã«ãã€ãã³ãã®æ§é ãšåãå ±åã§å®çŸ©ããŸããããã©ãŒãã³ã¹ãå¯èªæ§ããšã³ã·ã¹ãã ãšã®äºææ§ã«é¢ããŠãããŒãºã«æãé©ããã¹ããŒãå®çŸ©èšèªïŒAvroãProtobufãJSON SchemaïŒãéžæããŸããåã€ãã³ãåãšãã®ãã£ãŒã«ãã«å¯ŸããŠãæç¢ºãªåœåèŠåãšããã¥ã¡ã³ãã確ä¿ããŸãã
ã¹ããã2ïŒã¹ããŒãã¬ãžã¹ããªãéžæãã
ã¹ããŒã管çãäžå åããããã«ã¹ããŒãã¬ãžã¹ããªãå°å ¥ããŸããããã¯ãã°ããŒãã«ããŒã å šäœã§ã®äžè²«æ§ãããŒãžã§ã³ç®¡çãããã³äºææ§ãã§ãã¯ã®ããã«äžå¯æ¬ ã§ãã
ã¹ããã3ïŒã¹ããŒãã¬ãžã¹ããªãã¡ãã»ãŒãžãããŒã«ãŒãšçµ±åãã
ã¹ããŒãã¬ãžã¹ããªãšé£æºããããã«ã¡ãã»ãŒãžãããŒã«ãŒãŸãã¯ã€ãã³ãã¹ããªãŒãã³ã°ãã©ãããã©ãŒã ãèšå®ããŸããKafkaã®å Žåãããã¯éåžžãã¬ãžã¹ããªããã¹ããŒããååŸããã·ãªã¢ã©ã€ã¶ãŒãšãã·ãªã¢ã©ã€ã¶ãŒãèšå®ããããšãå«ã¿ãŸãããããã¥ãŒãµãŒã¯ã·ãªã¢ã©ã€ã¶ãŒã䜿çšããŠç»é²ãããã¹ããŒãã«åŸã£ãŠã¡ãã»ãŒãžããšã³ã³ãŒãããã³ã³ã·ã¥ãŒããŒã¯ãã·ãªã¢ã©ã€ã¶ãŒã䜿çšããŠã¡ãã»ãŒãžããã³ãŒãããŸãã
ã¹ããã4ïŒã¹ããŒã匷å¶ã䌎ããããã¥ãŒãµãŒãå®è£ ãã
ãããã¥ãŒãµãŒã¯æ¬¡ã®ããã«èšèšãããã¹ãã§ãã
- ããŒã¿ã®çæïŒçæãããã¯ã©ã¹ïŒAvro/ProtobufããïŒã䜿çšããããã¹ããŒãã«æºæ ããããŒã¿ãªããžã§ã¯ããæ§ç¯ããŸãã
 - ã·ãªã¢ã©ã€ãºïŒæ§æãããã·ãªã¢ã©ã€ã¶ãŒã䜿çšããŠãããŒã¿ãªããžã§ã¯ããéžæãããã€ããªãŸãã¯ããã¹ã圢åŒã«å€æããŸãã
 - ã¹ããŒãã®ç»é²ïŒæ°èŠã®å ŽåïŒïŒæ°ããã¹ããŒãããŒãžã§ã³ã®æåã®ã€ãã³ããå ¬éããåã«ããããã¹ããŒãã¬ãžã¹ããªã«ç»é²ããŸããã¬ãžã¹ããªã¯äºææ§ããã§ãã¯ããŸãã
 - å ¬éïŒã·ãªã¢ã©ã€ãºãããã€ãã³ããã¡ãã»ãŒãžãããŒã«ãŒã«éä¿¡ããŸãã
 
ã¹ããã5ïŒã¹ããŒãèªèã䌎ãã³ã³ã·ã¥ãŒããŒãå®è£ ãã
ã³ã³ã·ã¥ãŒããŒã¯æ¬¡ã®ããã«èšèšãããã¹ãã§ãã
- æ¶è²»ïŒã¡ãã»ãŒãžãããŒã«ãŒããçã®ã·ãªã¢ã©ã€ãºãããã€ãã³ããåä¿¡ããŸãã
 - ãã·ãªã¢ã©ã€ãºïŒæ§æããããã·ãªã¢ã©ã€ã¶ãŒã䜿çšããŠãã¹ããŒãã«åºã¥ããŠããŒã¿ãªããžã§ã¯ããåæ§ç¯ããŸãããã·ãªã¢ã©ã€ã¶ãŒã¯ãã¬ãžã¹ããªããé©åãªã¹ããŒããååŸããŸãã
 - åŠçïŒã³ã³ãã€ã«æãŸãã¯å®è¡æã®åãã§ãã¯ã®æ©æµãåããªãããå³å¯ã«åä»ããããããŒã¿ãªããžã§ã¯ããæ±ããŸãã
 
ã¹ããã6ïŒã¹ããŒãé²åããªã·ãŒã確ç«ãã
ã¹ããŒãé²åã®ããã®æç¢ºãªã«ãŒã«ãå®çŸ©ããŸããäžè¬çãªæŠç¥ã«ã¯ã以äžãå«ãŸããŸãã
- åŸæ¹äºææ§ïŒæ°ããã³ã³ã·ã¥ãŒããŒã¯ãå€ãã¹ããŒãã§çæãããããŒã¿ãèªã¿åãããšãã§ããŸããããã¯ããªãã·ã§ã³ãã£ãŒã«ãã远å ããããããã©ã«ãå€ã䜿çšããããšã§å®çŸãããŸãã
 - åæ¹äºææ§ïŒå€ãã³ã³ã·ã¥ãŒããŒã¯ãæ°ããã¹ããŒãã§çæãããããŒã¿ãèªã¿åãããšãã§ããŸããããã¯ãæ°ãããã£ãŒã«ããç¡èŠããããšã§å®çŸãããŸãã
 - å®å šãªäºææ§ïŒåŸæ¹ããã³åæ¹äºææ§ã®äž¡æ¹ãä¿èšŒããŸãã
 
ã¹ããŒãã¬ãžã¹ããªã¯ããããã®äºææ§ã«ãŒã«ã匷å¶ããããã«æ§æãããã¹ãã§ããã¹ããŒãã®é²åã¯åžžã«ã¹ããŒãžã³ã°ç°å¢ã§åŸ¹åºçã«ãã¹ãããŠãã ããã
ã¹ããã7ïŒç£èŠãšã¢ã©ãŒã
ã¹ããŒãé¢é£ã®ãšã©ãŒã«å¯ŸããŠå ç¢ãªç£èŠãå®è£ ããŸããã¢ã©ãŒãã¯æ¬¡ã®å Žåã«ããªã¬ãŒãããã¹ãã§ãã
- ã¹ããŒãæ€èšŒã®å€±æã
 - ã¹ããŒãã¬ãžã¹ããªæ¥ç¶ã®åé¡ã
 - äºæããªãã¹ããŒã倿ŽãŸãã¯éäºææ§ã
 
åå®å šãªã€ãã³ãã¹ããªãŒãã³ã°ã®ããã®ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªã³ã³ããã¹ãã§åå®å šãªã¡ãã»ãŒãžãããŒã«ãŒãå®è£ ããå Žåãããã€ãã®ç¹å®ã®èŠå ãé¢ä¿ããŠããŸãã
- ã¬ã€ãã³ã·ïŒã¹ããŒãã¬ãžã¹ããªãšã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã¡ã«ããºã ããã°ããŒãã«ãªãããã¯ãŒã¯ã¬ã€ãã³ã·ãåŠçããã®ã«ååãªããã©ãŒãã³ã¹ã§ããããšã確èªããŠãã ãããè€æ°ã®ãªãŒãžã§ã³ã«ã¹ããŒãã¬ãžã¹ããªããããã€ãããã忣ãã£ãã·ã¥ã䜿çšããããšãæ€èšããŠãã ããã
 - ããŒã¿æåšå°ãšã³ã³ãã©ã€ã¢ã³ã¹ïŒã€ãã³ãããŒã¿ãã©ãã§åŠçãããä¿åãããããçè§£ããŠãã ãããã€ãã³ãã®ã¹ããŒãã¯å¥çŽã§ãããå®éã®ã€ãã³ããã€ããŒãã¯å°åã®ããŒã¿æåšå°èŠå¶ïŒäŸïŒãšãŒãããã®GDPRïŒã«æºæ ããå¿ èŠãããå ŽåããããŸããã€ãã³ãã®åå®å šæ§ã¯ãæ©å¯ããŒã¿ãæç¢ºã«èå¥ãã管çããã®ã«åœ¹ç«ã¡ãŸãã
 - ã¿ã€ã ãŸãŒã³ãšã¿ã€ã ã¹ã¿ã³ãåŠçïŒç°ãªãã¿ã€ã ãŸãŒã³éã§ã¿ã€ã ã¹ã¿ã³ãã®äžè²«ããåŠçã確ä¿ããŠãã ãããISO 8601ããšããã¯ããªç§ã®ãããªæšæºåããã圢åŒãæç¢ºãªè«çåïŒäŸïŒAvroã®
timestamp-millisïŒãšãšãã«äœ¿çšããããšã¯äžå¯æ¬ ã§ãã - éè²šãšæž¬å®åäœïŒã¹ããŒãå
ã§é貚èšå·ãšæž¬å®åäœãæç€ºçã«ããŠãã ãããäŸãã°ãåã«
priceãã£ãŒã«ããšãã代ããã«ã{ "amount": 19.99, "currency": "USD" }ã®ãããªæ§é ãæ€èšããŠãã ãããããã«ãããåœéååŒãæ±ãéã®ææ§ãã鲿¢ãããŸãã - å€èšèªããŒã¿ïŒã€ãã³ãã«å€èšèªå¯Ÿå¿ãå¿
èŠãªããã¹ãããŒã¿ãå«ãŸããå Žåãèšèªã³ãŒãã®åŠçæ¹æ³ãå®çŸ©ããŸãïŒäŸïŒç°ãªãèšèªçšã®åå¥ãã£ãŒã«ãããŸãã¯
localized_name: { "en": "Product", "es": "Producto" }ã®ãããªæ§é åãã£ãŒã«ãïŒã - ããŒã ã³ã©ãã¬ãŒã·ã§ã³ãšããã¥ã¡ã³ãïŒã°ããŒãã«ã«åæ£ããéçºããŒã ã§ã¯ãã€ãã³ãã¹ããŒããšäœ¿çšãã¿ãŒã³ã«é¢ããäžè²«ããããã¥ã¡ã³ããç¶æããããšãäžå¯æ¬ ã§ããæç¢ºãªèª¬æãšäŸãå«ãé©åã«ç®¡çãããã¹ããŒãã¬ãžã¹ããªã¯ãã³ã©ãã¬ãŒã·ã§ã³ãå€§å¹ ã«æ¯æŽã§ããŸãã
 
ã±ãŒã¹ã¹ã¿ãã£ã®æç²ïŒæŠå¿µïŒ
ã°ããŒãã«å°å£²æ¥è ïŒæ³šæåŠçãã€ãã©ã€ã³
倧æåœéå°å£²æ¥è
ã¯ã泚æåŠçã«Kafkaã䜿çšããŠããŸããOrderPlacedãPaymentProcessedãShipmentInitiatedãªã©ã®ã€ãã³ãã¯éèŠã§ãã圌ãã¯Confluent Schema RegistryãšAvroã䜿çšããŠããŸããæ°ããå°åã远å ãããæ°ããé貚ïŒäŸïŒJPYïŒãå°å
¥ããããšãOrderPlacedã€ãã³ãã¹ããŒãã¯é²åããå¿
èŠããããŸãã{ "amount": 10000, "currency": "JPY" }ã®ãããªæ§é ãæã€ã¹ããŒãã䜿çšããåŸæ¹äºææ§ã確ä¿ããããšã§ãæ¢åã®æ³šæåŠçãµãŒãã¹ã¯å³åº§ã®æŽæ°ãªãã«æ©èœãç¶ããããšãã§ããŸããã¹ããŒãã¬ãžã¹ããªã¯ãäºææ§ã®ãªãã€ãã³ããå
¬éãããã®ãé²ãããã€ãã©ã€ã³å
šäœãå 
ç¢ãªãŸãŸã§ããããšãä¿èšŒããŸãã
ãã£ã³ããã¯äŒæ¥ïŒãã©ã³ã¶ã¯ã·ã§ã³ã€ãã³ã
ã°ããŒãã«ãªãã£ã³ããã¯äŒæ¥ã¯ãæ¯æ¥æ°çŸäžä»¶ã®éèååŒãåŠçããŠããŸããåå®å
šæ§ã¯è²ããŸããã圌ãã¯ã€ãã³ãã¹ããªãŒã ã§Protobufããã®ããã©ãŒãã³ã¹ãšã³ã³ãã¯ããªè¡šçŸã®ããã«æŽ»çšããŠããŸããTransactionCreatedãBalanceUpdatedã®ãããªã€ãã³ãã¯æ©å¯æ§ãé«ãã§ããã¹ããŒãã¬ãžã¹ããªãšProtobufã䜿çšããããšã§ãååŒéé¡ãå£åº§çªå·ãã¿ã€ã ã¹ã¿ã³ããåžžã«æ£ããè§£æãããããšãä¿èšŒãããé«äŸ¡ãªãšã©ãŒãèŠå¶éåãé²ããŸãã.protoãã¡ã€ã«ããã®ã³ãŒãçæã¯ãåœéçãªãªãã£ã¹ã§ç°ãªãèšèªã§äœæ¥ããéçºè
ã«å¯ŸããŠåŒ·åãªã³ã³ãã€ã«æä¿èšŒãæäŸããŸãã
çµè«
ãŸããŸãçžäºæ¥ç¶ããã忣åãããäžçã«ãããŠããµãŒãã¹ééä¿¡ã®ä¿¡é Œæ§ã¯ãæåããã¢ããªã±ãŒã·ã§ã³éçºã®ç€ç³ã§ããåå®å šãªã¡ãã»ãŒãžãããŒã«ãŒãšå ç¢ãªã€ãã³ãã¹ããªãŒãã³ã°åå®è£ ã¯ãåãªãé«åºŠãªãã¯ããã¯ã§ã¯ãããŸããããããã¯ãã°ããŒãã«èŠæš¡ã§å埩åããããã¹ã±ãŒã©ãã«ã§ãä¿å®å¯èœãªã·ã¹ãã ãæ§ç¯ããããã®åºæ¬çãªèŠä»¶ã§ãã
ã¹ããŒãå®çŸ©èšèªãæ¡çšããã¹ããŒãã¬ãžã¹ããªã掻çšããèŠåŸããã¹ããŒãé²åæŠç¥ãéµå®ããããšã§ãçµç¹ã¯ããŒã¿æŽåæ§ãšã·ã¹ãã é害ã«é¢é£ãããªã¹ã¯ãå€§å¹ ã«è»œæžã§ããŸããããŒã¿ã³ã³ãã©ã¯ããå®çŸ©ã匷å¶ããããã®ãã®ç©æ¥µçãªã¢ãããŒãã¯ããµãŒãã¹ã®å°ççãªåæ£ãéçºããŒã ã®å€æ§æ§ã«é¢ãããã忣ã·ã¹ãã ãäºæž¬å¯èœãã€ç¢ºå®ã«éä¿¡ã§ããããšãä¿èšŒããŸããåå®å šæ§ãžã®æè³ã¯ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®é·æçãªå®å®æ§ãšæåãžã®æè³ã§ãã